/*
 * 爱组搭，低代码组件化开发平台
 * ------------------------------------------
 * 受知识产权保护，请勿删除版权申明，开发平台不允许做非法网站，后果自负
 */
package com.aizuda.boot.modules.system.service;

import com.aizuda.boot.modules.system.entity.SysDepartment;
import com.aizuda.boot.modules.system.entity.vo.DepartmentHeadVO;
import com.aizuda.boot.modules.system.entity.vo.SysDepartmentVO;
import com.aizuda.boot.modules.system.entity.vo.department.DepartmentDetailVO;
import com.aizuda.boot.modules.system.entity.vo.department.DepartmentInfoDTO;
import com.aizuda.boot.modules.system.entity.vo.department.DepartmentTenantDTO;
import com.aizuda.boot.modules.system.entity.vo.department.DepartmentTreeVO;
import com.aizuda.service.service.IBaseService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.List;
import java.util.Map;

/**
 * 部门 服务类
 *
 * @author 青苗
 * @since 2021-11-07
 */
public interface ISysDepartmentService extends IBaseService<SysDepartment> {

    Page<SysDepartment> page(Page<SysDepartment> page, SysDepartment sysDepartment);

    List<SysDepartmentVO> listTree(SysDepartment sysDepartment);


    /**
     * 根据用户ID获取该用户所在系统租户部门列表
     * @param userId
     * @return
     */
    List<SysDepartment> getSysDepartmentListByUserId(Long userId);

    /**
     * 列表（显示所有部门）
     */
    List<SysDepartment> listAll();

    /**
     * 获取部门主管信息
     *
     * @param userId       用户ID
     * @param examineLevel 指定主管层级
     * @param multiLevel   连续多级主管
     */
    List<DepartmentHeadVO> getDepartmentHeadInfo(Long userId, Integer examineLevel, boolean multiLevel);

    /**
     * 修改状态
     */
    boolean updateStatusById(Long id, Integer status);

    /**
     * 获取部门名称
     * @return
     */
    Map<Long, String> getAllDepartmentNames();

    // ============ 兼容原department模块的方法 ============

    /**
     * 获取部门树 - 兼容原接口
     * @return 部门树列表
     */
    List<DepartmentTreeVO> getDepartmentTreeForCompatibility();

    /**
     * 根据父节点ID获取部门树 - 兼容原接口
     * @param parentNodeId 父节点ID
     * @return 部门树列表
     */
    List<DepartmentTreeVO> getDepartmentTreeByParentIdForCompatibility(Long parentNodeId);

    /**
     * 获取部门详情 - 兼容原接口
     * @param departmentId 部门ID
     * @return 部门详情
     */
    DepartmentDetailVO getDepartmentDetailForCompatibility(Long departmentId);

    /**
     * 获取员工主部门信息（兼容性方法）
     * @param employeeId 员工ID
     * @return 部门信息
     */
    DepartmentInfoDTO getEmployeeMainDepartmentForCompatibility(Long employeeId);

    /**
     * 批量获取员工主部门信息
     * @param employeeIds 员工ID列表
     * @return 员工ID到部门信息的映射
     */
    Map<Long, DepartmentInfoDTO> batchGetEmployeeMainDepartments(List<Long> employeeIds);

    /**
     * 根据租户获取部门树 - 兼容原接口
     * @param tenantId 租户ID
     * @return 部门树
     */
    DepartmentTreeVO getDepartmentTreeByTenantForCompatibility(Long tenantId);


    /**
     * 同步飞书部门
     * 该方法用于从飞书同步部门信息到本地系统
     */
    public void syncFeiShuDept();


    /**
     * 设置独立租户
     */
    void setIndependentTenant(Long departmentId);


    /**
     * 根据用户id和
     *
     * @param userId 用户id
     * @param tenantKey 飞书租户key
     * @return com.aizuda.boot.modules.system.entity.SysDepartment
     * @author hjw
     * @date 2025/7/12 14:07
     */
    SysDepartment getDepByUserIdAndTenantKey(Long userId, String tenantKey);
    /**
     *  同步飞书部门主管
     *
     * @author hjw
     * @date 2025/7/10 15:48
     */
    void syncFeiShuDepManager();

    /**
     * 获取用户的系统租户部门信息
     *
     * @param userId 用户id
     * @param depId 部门id
     * @return com.aizuda.boot.modules.system.entity.SysDepartment
     * @author hjw
     * @date 2025/7/14 14:49
     */
    SysDepartment getSysTenantDept(Long userId, Long depId);


    /**
     * 构建子集部门
     * @param id
     * @param list
     * @return
     */
    List<DepartmentTreeVO> buildChildren(Long id, List<SysDepartment> list);

    /**
     * 根据租户key获取部门
     * @param sysTenantKey
     * @return
     */
    DepartmentTreeVO getDepartmentTreeBySysTenantKey(String sysTenantKey);

    /**
     * 根据用户获取部门树
     * @return
     */
    List<DepartmentTreeVO> getDepartmentTreeByUser();

    /**
     * 根据部门递归父部门获取部门树
     * @param departmentIds
     * @return
     */
    List<DepartmentTreeVO> listAllParentDepartments(List<Long> departmentIds);

    /**
     * 获取租户顶级部门信息
     * @return
     */
    List<DepartmentTenantDTO> getTenantDepartmentInfoList();
}
